{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Jawi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\">\n",
    "\n",
    "This tutorial is available as an IPython notebook at [Malaya/example/jawi](https://github.com/huseinzol05/Malaya/tree/master/example/jawi).\n",
    "    \n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-warning\">\n",
    "\n",
    "This module heavily trained on news and wikipedia dataset.\n",
    "    \n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Explanation\n",
    "\n",
    "Originally from https://www.ejawi.net/converterV2.php?go=rumi able to convert Rumi to Jawi using heuristic method. So Malaya convert from heuristic and map it using deep learning model by inverse the dataset.\n",
    "\n",
    "`چوميل` -> `comel`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 2.77 s, sys: 3.96 s, total: 6.73 s\n",
      "Wall time: 1.99 s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/husein/dev/malaya/malaya/tokenizer.py:214: FutureWarning: Possible nested set at position 3397\n",
      "  self.tok = re.compile(r'({})'.format('|'.join(pipeline)))\n",
      "/home/husein/dev/malaya/malaya/tokenizer.py:214: FutureWarning: Possible nested set at position 3927\n",
      "  self.tok = re.compile(r'({})'.format('|'.join(pipeline)))\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "import malaya"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### List available HuggingFace model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'mesolitica/jawi-nanot5-tiny-malaysian-cased': {'Size (MB)': 205,\n",
       "  'Suggested length': 2048,\n",
       "  'jawi-rumi chrF2++': 97.72,\n",
       "  'rumi-jawi chrF2++': 98.57,\n",
       "  'from lang': ['jawi', 'rumi'],\n",
       "  'to lang': ['jawi', 'rumi']},\n",
       " 'mesolitica/jawi-nanot5-small-malaysian-cased': {'Size (MB)': 358,\n",
       "  'Suggested length': 2048,\n",
       "  'jawi-rumi chrF2++': 98.01,\n",
       "  'rumi-jawi chrF2++': 98.97,\n",
       "  'from lang': ['jawi', 'rumi'],\n",
       "  'to lang': ['jawi', 'rumi']}}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "malaya.jawi.available_huggingface"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tested on first 10k Rumi-Jawi test set, dataset at https://huggingface.co/datasets/mesolitica/rumi-jawi\n"
     ]
    }
   ],
   "source": [
    "print(malaya.jawi.info)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load HuggingFace model\n",
    "\n",
    "```python\n",
    "def huggingface(\n",
    "    model: str = 'mesolitica/jawi-nanot5-small-malaysian-cased',\n",
    "    force_check: bool = True,\n",
    "    **kwargs,\n",
    "):\n",
    "    \"\"\"\n",
    "    Load HuggingFace model to translate.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    model: str, optional (default='mesolitica/jawi-nanot5-small-malaysian-cased')\n",
    "        Check available models at `malaya.jawi.available_huggingface`.\n",
    "    force_check: bool, optional (default=True)\n",
    "        Force check model one of malaya model.\n",
    "        Set to False if you have your own huggingface model.\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    result: malaya.torch_model.huggingface.Translation\n",
    "    \"\"\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.\n"
     ]
    }
   ],
   "source": [
    "model = malaya.jawi.huggingface()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Convert to Rumi\n",
    "\n",
    "```python\n",
    "def generate(self, strings: List[str], to_lang: str = 'ms', **kwargs):\n",
    "    \"\"\"\n",
    "    Generate texts from the input.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    strings : List[str]\n",
    "    to_lang: str, optional (default='ms')\n",
    "        target language to translate.\n",
    "    **kwargs: vector arguments pass to huggingface `generate` method.\n",
    "        Read more at https://huggingface.co/docs/transformers/main_classes/text_generation\n",
    "\n",
    "        If you are using `use_ctranslate2`, vector arguments pass to ctranslate2 `translate_batch` method.\n",
    "        Read more at https://opennmt.net/CTranslate2/python/ctranslate2.Translator.html?highlight=translate_batch#ctranslate2.Translator.translate_batch\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    result: List[str]\n",
    "    \"\"\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "strings = ['د لابوان ابفچ.',\n",
    " 'سبلومڽ لبيه باڽق جوملهڽ.',\n",
    " 'دان ممرلوكن ڤمبلاان.',\n",
    " 'يڠ لاين.',\n",
    " 'كريتا ڤروندا درڤد بالاي ڤوليس باچوق.',\n",
    " 'سلڤس ٢٨ ڤوسيڠن رونديڠن دان ١٨ مشوارت منتري سلاما كيرا-كيرا توجوه تاهون، رونديڠن ايت',\n",
    " 'ڤنجاڬ ڤرلو فهم دان اد علمو اوروس ورڬ امس، ايلق ڽاڽوق لبيه تروق.',\n",
    " 'ڬوندڠ اداله تيدق بنر، كات كمنترين ڤرتانين دان ايندوستري اساس تاني ﴿موا﴾.',\n",
    " 'بلياو ﴿ازهم﴾ داتڠ ك فام ڤد خميس لڤس برجومڤا دڠن ستياءوسها اڬوڠ فام ﴿ستوارت راماليڠام﴾ سلڤس ايت كلوار دڠن كڽاتأن',\n",
    " 'يڠ توروت حاضر، تيمبالن ڤردان منتري، داتوق سري در وان عزيزه وان اسماعيل دان منتري كابينيت.']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "spaces_between_special_tokens is deprecated and will be removed in transformers v5. It was adding spaces between `added_tokens`, not special tokens, and does not exist in our fast implementation. Future tokenizers will handle the decoding process on a per-model rule.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['di labuan ibfc.',\n",
       " 'sebelumnya lebih banyak jumlahnya.',\n",
       " 'dan memerlukan pembelaan.',\n",
       " 'yang lain.',\n",
       " 'kereta peronda daripada balai polis bachok.',\n",
       " 'selepas 28 pusingan rundingan dan 18 mesyuarat menteri selama kira-kira tujuh tahun, rundingan itu',\n",
       " 'penjaga perlu faham dan ada ilmu urus warga emas, elak nyanyuk lebih teruk.',\n",
       " 'gundang adalah tidak benar, kata kementerian pertanian dan industri asas tani (moa).',\n",
       " 'beliau (izham) datang ke fama pada khamis lepas berjumpa dengan setiausaha agung fama (stuart ramalingam) selepas itu keluar dengan kenyataan',\n",
       " 'yang turut hadir, timbalan perdana menteri, datuk seri dr wan azizah wan ismail dan menteri kabinet.']"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.generate(strings, to_lang = 'rumi', max_length = 1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Convert to Jawi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "s = 'Selain itu, pameran kerjaya membantu para pelajar menentukan kerjaya yang akan diceburi oleh mereka. Seperti yang kita ketahui, pasaran kerjaya di Malaysia sangat luas dan masih banyak sektor pekerjaan di negara ini yang masih kosong kerana sukar untuk mencari tenaga kerja yang benar-benar berkelayakan. Sebagai contohnya, sektor perubatan di Malaysia menghadapi masalah kekurangan tenaga kerja yang kritikal, khususnya tenaga pakar disebabkan peletakan jawatan oleh doktor dan pakar perubatan untuk memasuki sektor swasta serta berkembangnya perkhidmatan kesihatan dan perubatan. Setelah menyedari  hakikat ini, para pelajar akan lebih berminat untuk menceburi bidang perubatan kerana pameran kerjaya yang dilaksanakan amat membantu memberikan pengetahuan am tentang kerjaya ini'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['سلاين ايت، ڤاميرن كرجاي ممبنتو ڤارا ڤلاجر مننتوكن كرجاي يڠ اكن دچبوري اوليه مريك. سڤرتي يڠ كيت كتاهوي، ڤاسرن كرجاي د مليسيا ساڠت لواس دان ماسيه باڽق سيكتور ڤكرجأن د نڬارا اين يڠ ماسيه كوسوڠ كران سوكر اونتوق منچاري تناڬ كرجا يڠ بنر-بنر بركلاياكن. سباڬاي چونتوهڽ، سيكتور ڤروبتن د مليسيا مڠهادڤي مسئله ككوراڠن تناڬ كرجا يڠ كريتيكال، خصوصڽ تناڬ ڤاكر دسببكن ڤيليتاكن جاوتن اوليه دوكتور دان ڤاكر ڤروبتن اونتوق مماسوقكي سيكتور سواستا سرتا بركمبڠڽ ڤرخدمتن كصيحتن دان ڤروبتن. ستله مڽدري  حقيقة اين، ڤارا ڤلاجر اكن لبيه برمينت اونتوق منچبوري بيدڠ ڤروبتن كران ڤاميرن كرجاي يڠ دلقسانكن امت ممبنتو ممبريكن ڤڠتاهوان عام تنتڠ كرجاي اين']"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.generate([s], to_lang = 'jawi', max_length = 1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['ڤنجوالان اسيت ڬس ڤيترونس د ازيربيجن ١١.٣٣ ڤڬ. داتوء سري انور بن إبراهيم تدبير عيماه: توان يڠ د-ڤرتوا، ساي موهون مڠموكاكن اصول د باوه ڤراتورن مشوارت ١٨﴿١﴾ دان ١٨﴿٢﴾ ڤراتورن-ڤراتورن مجليس مشوارت ديوان رعيت سڤرتي برايكوت:\"بهاوا ديوان يڠ برسيدڠ ڤد هاري اين مرونديڠكن لاڤورن بهاوا ڤيترونس تله منجوال اسيت ڬس د أذربيجان دڠن هرڬ همڤير رم١٠ بيلياون برايكوتن دسقن كراجأن مناءيقكن بايرن ديۏيدن ڤيترونس سباڽق رم٢٥ بيلياون كڤد كراجأن باڬي تاهون ٢٠٢١.\" ڤركارا اين اداله ڤركارا ترتنتو كران ڤنجوالن اسيت ڬس د أذربيجان برنيلاي رم١٠ بيلياون دان جوڬ ڤمبايرن ديۏيدن كڤد كراجأن سباڽق رم٢٥ بيلياون باڬي تاهون ٢٠٢١ اداله بربهاي دان منجيجسكن ماس دڤن ڤيترونس. تركايت دڠن-- سديكيت ڤنجلسن. كران تيندقن سڤرتي اين تله مڽببكن ج.ڤ. مورڬن مڠلواركن ڤيترونس دري ايس عيم كي ايميرڬيڠ مركيت بوند اينديك س دان ايس عيم كي ايايك س ڤيچتل اسس. اوليه ايت، ڤركارا ايت ڤرلو دسڬراكن كران ڤيترونس مڠالمي دفيسيت برايكوتن ڤمبايرن ديۏيدن برلبيهن سجق تاهون ٢٠١٨ سهيڠڬ كيني يڠ ممقسا ڤيترونس منجوال اسيت اتاو ممينجم لبيه باڽق دانا لوار نڬارا باڬي منمڤوڠ اليرن توناي.']"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import re\n",
    "from unidecode import unidecode\n",
    "\n",
    "def simple_cleaning(s):\n",
    "    s = unidecode(s).replace('\\n', '')\n",
    "    return re.sub(r'[ ]+', ' ', s).strip()\n",
    "\n",
    "s = \"\"\"\n",
    "PENJUALAN ASET GAS PETRONAS DI AZERBAIJAN \\n\\n \\n\\n11.33 pg. \\n\\nDato’ Seri Anwar bin Ibrahim [Port Dickson]: Tuan Yang di-Pertua, saya \\nmohon mengemukakan usul di bawah Peraturan Mesyuarat 18(1) dan 18(2) Peraturan-\\nperaturan Majlis Mesyuarat Dewan Rakyat seperti berikut: \\n\\n“Bahawa Dewan yang bersidang pada hari ini merundingkan \\nlaporan bahawa Petronas telah menjual aset gas di Azerbaijan dengan \\nharga hampir RM10 bilion berikutan desakan kerajaan menaikkan \\nbayaran dividen Petronas sebanyak RM25 bilion kepada kerajaan bagi \\ntahun 2021.” \\n\\n \\nPerkara ini adalah perkara tertentu kerana penjualan aset gas di Azerbaijan \\n\\nbernilai RM10 bilion dan juga pembayaran dividen kepada kerajaan sebanyak RM25 bilion \\nbagi tahun 2021 adalah berbahaya dan menjejaskan masa depan Petronas. Terkait \\ndengan― sedikit penjelasan.  Kerana tindakan seperti ini telah menyebabkan J.P. Morgan \\nmengeluarkan Petronas dari ESG Emerging Market Bond Index dan ESG Asia Credit \\nIndex.  \\n\\nOleh itu, perkara itu perlu disegerakan kerana Petronas mengalami defisit \\nberikutan pembayaran dividen berlebihan sejak tahun 2018 sehingga kini yang memaksa \\nPetronas menjual aset atau meminjam lebih banyak dana luar negara bagi menampung \\naliran tunai.\n",
    "\"\"\"\n",
    "s = simple_cleaning(s)\n",
    "model.generate([s], to_lang = 'jawi', max_length = 1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
